package com.cms.bs.app.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSONArray;
import com.avaje.ebean.Ebean;
import com.avaje.ebean.ExpressionList;
import com.avaje.ebean.PagedList;
import com.cms.bs.app.model.User;
import com.cms.bs.app.service.IUserService;
import com.cms.bs.app.service.base.BaseService;
import com.cms.bs.config.rs.PageRS;
import com.cms.bs.config.rs.RS;
import com.cms.bs.util.BaseTypeUtil;
import com.cms.bs.util.CommonUtil;
import com.cms.bs.util.JsonUtil;
import com.cms.bs.util.Log4jUtil;
import org.springframework.stereotype.Service;

import java.util.Arrays;

/**
 * Created by jiang on 2016-09-23.
 */
@Service
public class UserService extends BaseService implements IUserService {

    /**
     * 创建用户
     *
     * @param user
     * @return
     */
    @Override
    public RS create(User user) {
        try {
            // 1.1 判断参数是否异常
            if (user == null
                    || StringUtils.isEmpty(user.getName())
                    || StringUtils.isEmpty(user.getPassword())) {
                return RS.bad("参数异常.");
            }
            // 1.2 判断用户名是否存在
            int count = Ebean.find(User.class).where().eq("name", user.getName()).findCount();
            if (count > 0) {
                return RS.bad("用户已存在，请重新录入.");
            }
            // 1.3 密码md5加密
            user.setPassword(CommonUtil.md5(user.getPassword(), "password"));
            // 1.4 保存用户信息
            Ebean.save(user);
            return RS.ok();
        }catch (Exception e){
            Log4jUtil.error(this.getClass().getName(), "create user 异常：", e);
        }
        return RS.bad("创建用户记录异常.");
    }

    /**
     * 删除 用户
     *
     * @param id
     * @return
     */
    @Override
    public RS delete(String id) {
        try {
            if (id != null) {
                int delete = 0;
                if (id.contains(",")) {
                    delete = Ebean.deleteAll(User.class, Arrays.asList(id.split(",")));
                } else {
                    delete = Ebean.delete(User.class, id);
                }
                if (delete > 0) {
                    return RS.ok();
                }
                return RS.bad("用户不存在或已被删除.");
            }
            return RS.bad("参数错误.");
        }catch (Exception e){
            Log4jUtil.error(this.getClass().getName(), "delete user 异常：", e);
        }
        return RS.bad("删除用户记录异常.");
    }

    /**
     * 修改 用户
     *
     * @param user
     * @return
     */
    @Override
    public RS update(User user) {
        try {
            // 1.1 判断参数是否异常
            if (user == null || BaseTypeUtil.safeLong(user.getId()) == 0) {
                return RS.bad("参数异常.");
            }
            // 1.2 判断用户名是否存在
            int count = Ebean.find(User.class).where().eq("id", user.getId()).findCount();
            if (count <= 0) {
                return RS.bad("用户不存在.");
            }
            // 1.3 密码md5加密
            user.setPassword(CommonUtil.md5(user.getPassword(), "password"));
            // 1.4 保存用户信息
            Ebean.update(user);
            return RS.ok();
        }catch (Exception e){
            Log4jUtil.error(this.getClass().getName(), "update user 异常：", e);
        }
        return RS.bad("更新用户记录异常.");
    }

    /**
     * 获取 用户 详情
     *
     * @param id
     * @return
     */
    @Override
    public RS get(String id) {
        try {
            User user = Ebean.find(User.class).where().eq("id", id).findUnique();
            if (user != null) {
                return RS.ok(user);
            }
            return RS.bad("获取用户详情失败.");
        }catch (Exception e){
            Log4jUtil.error(this.getClass().getName(), "get user 异常：", e);
        }
        return RS.bad("获取用户详情异常.");
    }

    /**
     * 获取 用户列表： 分页
     *
     * @param user
     * @return
     */
    @Override
    public PageRS list(User user) {
        try {
            ExpressionList<User> expList = Ebean.find(User.class).where();

            // 分页
            int pageIndex = 1;
            int pageSize = 100;

            if (user != null) {
                if (user.getPageIndex() != null) {
                    pageIndex = BaseTypeUtil.safeInt(user.getPageIndex());
                }
                if (user.getPageSize() != null) {
                    pageSize = BaseTypeUtil.safeInt(user.getPageSize());
                }
            }

            JSONArray params = JsonUtil.toJSONArray(user.getQueryParams());
            if (params != null && params.size() > 0) {
                expList.add(this.addQueryParam(params));
            }
            int rowStart = (pageIndex - 1) * pageSize;
            PagedList<User> pagedList = expList.setFirstRow(rowStart).setMaxRows(pageSize).findPagedList();
            int totalRow = pagedList.getTotalCount();
            int totalPage = pagedList.getTotalPageCount();
            return PageRS.ok(pageIndex, pageSize, totalRow, totalPage, pagedList.getList());
        }catch (Exception e){
            Log4jUtil.error(this.getClass().getName(), "list user 异常：", e);
        }
        return PageRS.bad("获取用户列表异常.");
    }

}
